#include "mid_uart.h"
#include "ac780x_uart_reg.h"
#include "ac780x_uart.h"
#include "ac780x_gpio.h"
// #include "lpuart_driver.h"



// /*! Driver state structure */
// lpuart_state_t lpuart_State[ MAX_INST_LPUART ];
// boolean m_UartInited[ MAX_INST_LPUART ] = { FALSE, FALSE, FALSE };

// uint8_t lpuart_revdata[3];
// boolean LPUART_InitIf(const uint8_t port,
//                     const lpuart_user_config_t * lpuartUserConfig,
//                     uint8_t priority,
//                     uart_callback_t pfnTxCB,
//                     uart_callback_t pfnRxCB
//                     )  
// {
// 	boolean rt = FALSE;
//     status_t retVal = STATUS_SUCCESS;

//     if ( port >= MAX_INST_LPUART ){
//         return rt;
//     }

//     retVal = LPUART_DRV_Init( port, &lpuart_State[port], lpuartUserConfig );
//     if ( STATUS_SUCCESS == retVal)
// 	{
// 		INT_SYS_SetPriority((IRQn_Type)(LPUART0_RxTx_IRQn + port*2), priority );
// 	}

// 	rt = ( STATUS_SUCCESS == retVal ) ? TRUE : FALSE;
//     if ( rt )
//     {
//         LPUART_DRV_InstallTxCallback( port, pfnTxCB, NULL );
//         LPUART_DRV_InstallRxCallback( port, pfnRxCB, NULL );
//         m_UartInited[port] = TRUE;
//     }
//     return rt;
// }
// boolean LPUART_Deinit( const uint8_t port )
// {
//     boolean rt = FALSE;
//     status_t retVal = STATUS_SUCCESS;

//     if ( m_UartInited[port] )
//     {
//         retVal = LPUART_DRV_Deinit( port );

//         rt = ( STATUS_SUCCESS == retVal ) ? TRUE : FALSE;
//         if ( rt )
//         {
//             m_UartInited[port] = FALSE;
//         }
//     }

//     return rt;
// }
// void LPUART_InstallReceiveData(uint8_t port)
// {
//     LPUART_DRV_ReceiveData(port, (uint8_t*)&lpuart_revdata[port],1);
// }
// boolean LPUART_Write(uint8_t port, const uint8_t * txBuff, uint32_t txSize)
// {
//     boolean rt = FALSE;
//     status_t retVal = STATUS_SUCCESS;
// //    retVal = LPUART_DRV_SendDataBlocking(port,txBuff,txSize,10);
// 		retVal = LPUART_DRV_SendData(port,txBuff,txSize);
//     rt = ( STATUS_SUCCESS == retVal ) ? TRUE : FALSE;
//     return rt;
// }
// boolean LPUART_WriteByte(uint8_t port, const uint8_t * txBuff, uint32_t txSize)
// {
//     boolean rt = FALSE;
//     status_t retVal = STATUS_SUCCESS;
//     retVal = LPUART_DRV_SendData(port,txBuff,txSize);
//     rt = ( STATUS_SUCCESS == retVal ) ? TRUE : FALSE;
//     return rt;
// }
// boolean LPUART_IsCanSend(uint8_t port)
// {
//     boolean rt = FALSE;
//     status_t retVal = STATUS_BUSY;
//     retVal = LPUART_DRV_GetTransmitStatus(port, NULL);
//     rt = ( STATUS_SUCCESS == retVal ) ? TRUE : FALSE;
//     return rt;
// }




// extern void LPUART_DRV_IRQHandler(uint32_t instance);
// void LPUART0_RxTx_IRQHandler(void)
// {
//     LPUART_DRV_IRQHandler(0);
// }
// void LPUART1_RxTx_IRQHandler(void)
// {
//     LPUART_DRV_IRQHandler(1);
// }
// void LPUART2_RxTx_IRQHandler(void)
// {
//     LPUART_DRV_IRQHandler(2);
// }
void UART0_Init(void) 
{
    UART_ConfigType uart_config;    /* UART config struct */

    memset(&uart_config, 0U, sizeof(uart_config));

    GPIO_SetFunc(GPIOA, GPIO_PIN7, GPIO_FUN1);     /* uart tx */
    GPIO_SetFunc(GPIOA, GPIO_PIN8, GPIO_FUN1);     /* uart rx */

    uart_config.baudrate   = 115200U;              /* set uart baudrate: 115200 */
    uart_config.dataBits   = UART_WORD_LEN_8BIT;   /* select word length: 8bit */
    uart_config.stopBits   = UART_STOP_1BIT;       /* select 1bit stop */
    uart_config.parity     = UART_PARI_NO;         /* set UART Parity: no parity  */
    uart_config.fifoByteEn = DISABLE;              /* Disable uart fifo */
    uart_config.dmaEn      = UART_DMA_TXRX_NONE;   /* Disable uart dma */
    uart_config.sampleCnt  = UART_SMP_CNT0;        /* select uart sample counter: SAM_CNT0: based on 16*baud_pulse, baud_rate = APB CLOCK/16/{DLH, DLL} */
    uart_config.callBack   = NULL;                 /* uart callback function */

    UART_Init(UART0, &uart_config);                /* uart init function */
}

uint8_t UART0_WriteByte(uint8_t data)
{    
    UART_SendData(UART0, data);
	return 0;
}

uint16_t UART0_Write(uint8_t data[], uint8_t data_len)
{
	uint16_t i;
	for(i = 0; i < data_len; i++)
	{
		UART0_WriteByte(data[i]);
	}
	return 0;
}

void UART0_DeInit(void)
{
	UART_DeInit(UART0);
}

void upgrade_SysReset(void)
{
	__NVIC_SystemReset();
}